package cn.lili.modules.wallet.service;


import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.payment.entity.dos.UserWallet;
import cn.lili.modules.payment.entity.dto.ProfitSharingRequestDTO;
import cn.lili.modules.payment.entity.dto.UserFmoneyUpdateDTO;
import cn.lili.modules.payment.entity.dto.UserPointUpdateDTO;
import cn.lili.modules.payment.entity.dto.UserWalletUpdateDTO;
import cn.lili.modules.payment.entity.vo.WalletVO;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 用户钱包业务层
 *
 * @author pikachu
 * @since 2020-02-25 14:10:16
 */
public interface WalletService extends IService<UserWallet> {

    /**
     * 获取钱包VO
     *
     * @param userId 会员id
     * @return 用户钱包VO
     */
    WalletVO getWalletVO(String userId);

    /**
     * 根据用户获取钱包
     *
     * @param userId 会员id
     * @return 用户钱包
     */
    UserWallet getFromUserid(String userId);

    /**
     * 用户余额充值
     *
     * @param userWalletUpdateDTO 变动模型
     */
    void recharge(UserWalletUpdateDTO userWalletUpdateDTO);

    /**
     * 增加用户预存款余额 会从平台账户扣除
     *
     * @param userWalletUpdateDTO 变动模型
     */
    void increase(UserWalletUpdateDTO userWalletUpdateDTO);

    /**
     * 扣减用户预存款余额 充值进入平台账户
     *
     * @param userWalletUpdateDTO 变动模型
     */
    void reduce(UserWalletUpdateDTO userWalletUpdateDTO);

    /**
     * 提现 用户余额直接扣除，用于平台不审核提现的场景，通常情况下不会被调用
     *
     * @param userWalletUpdateDTO 变动模型
     */
    void withdrawal(UserWalletUpdateDTO userWalletUpdateDTO);

    /**
     * 从冻结金额到余额
     *
     * @param userWalletUpdateDTO 变动模型
     */
    void increaseWithdrawal(UserWalletUpdateDTO userWalletUpdateDTO);


    /**
     * 提现扣减余额到冻结金额
     *
     * @param userWalletUpdateDTO 变动模型
     */
    void reduceWithdrawal(UserWalletUpdateDTO userWalletUpdateDTO);

    /**
     * 提现扣减冻结金额
     *
     * @param userWalletUpdateDTO 变动模型
     */
    void reduceFrozen(UserWalletUpdateDTO userWalletUpdateDTO);

    /**
     * 设置支付密码
     *
     * @param password 支付密码
     */
    void setUserWalletPassword(String password);

    /**
     * 设置支付密码
     *
     * @param oldPassword 旧密码
     * @param password    支付密码
     */
    void updateUserWalletPassword(String oldPassword, String password);

    /**
     * 检查当前会员是否设置过预存款密码
     */
    Boolean checkPassword();

    /**
     * 用户积分变动
     *
     * @param userPointUpdateDTO 用户积分变动模型
     */
    void updateMemberPoint(UserPointUpdateDTO userPointUpdateDTO);

    /**
     * 用户积分变动V2
     *
     * @param userPointUpdateDTO 用户积分变动模型
     */
    void updateMemberPointV2(UserPointUpdateDTO userPointUpdateDTO);


    /**
     * 用户积分变动
     *
     * @param userPointUpdateDTO 用户积分变动模型
     */
    void updateMemberFmoney(UserFmoneyUpdateDTO userPointUpdateDTO);


    /**
     * 余额分账
     *
     * @param profitSharingRequestDTO 分账明细
     */
    void profitSharing(ProfitSharingRequestDTO profitSharingRequestDTO);

    void strikeBalance (String userId);

    void strikeBalanceByRemainder (String userId);

    void shareProfitStrike (String userId);

    ResultMessage<Object> addBalance(String openId, String orderSn, Double money, String remark, String payType);

}